package cloud

import (
	"fmt"
	"github.com/astaxie/beego/logs"
	"smart_home/api/models"
	"smart_home/api/xfyun/depots"
	"strings"
)

func init() {
	registerCloud("switch_default", switch_default)
}

/*
{switch}设备
{switch}
{switch}{equipment}
{switch}{scene}{equipment}
*/
func switch_default(rq *depots.Request, res *depots.XfyunResult, userParams *UserParams) {
	// 设备
	// 0.app
	// 1.无外放设备
	// 2.有外放设备
	var (
		err                    error
		eqName, scName, actMsg string
		eqs                    []*models.Equipment
		eq                     *models.Equipment
	)

	res.Data["act"] = false
	actMsg = rq.GetSlot("switch").Value
	if actMsg == "开" || actMsg == "打开" || actMsg == "开启" || actMsg == "启动" {
		res.Data["act"] = true
	}

	if slot := rq.GetSlot("equipment"); slot != nil {
		eqName = slot.Value
	} else {
		// 没有指定设备名称
		goto NoEquipmentName
	}

	// 判断是否为操作使用模式
	if strings.Replace(eqName, "模式", "", 1)+"模式" == eqName {
		goto UseMode
	}

	if eqNames := strings.Split(eqName, "的"); len(eqNames) > 1 {
		scName = eqNames[0]
		eqName = eqNames[1]
	} else if slot := rq.GetSlot("scene"); slot != nil {
		scName = slot.Value
	}

	if eqs, err = models.GetAllEquipmentByUid(userParams.User.Id, 0, map[string]interface{}{"name": eqName}); err != nil {
		logs.Error("switch_default err:", err)
		goto Err
	}

	if eqs == nil {
		goto NoFind
	}

	// 找到的设备数量 > 1 && 没有指定场景名称
	if l := len(eqs); l > 1 && len(scName) == 0 {
		res.Answer = fmt.Sprintf("找到%d个%s, 你可以说：%s%s的%s", l, eqName, actMsg, eqs[0].Scene.Name, eqName)
		return
	}

	// 如果指定了场景，则比对场景
	if len(scName) > 0 {
		for k, v := range eqs {
			if v.Scene.Name == scName {
				eq = eqs[k]
			}
		}
		if eq == nil {
			goto NoFind
		}
	} else {
		eq = eqs[0]
	}

	res.Answer = fmt.Sprintf("正在为您%s%s", actMsg, eqName)
	res.IsHandle = true
	res.SetData("name", eqName)
	res.SetData("sta", eq.Sta)
	return

NoFind:
	res.Answer = "您还没有智能设备，请到聆漆购买吧"
	return
Err:
	res.Answer = "系统发生错误，请再试一次吧"
	return

	// 不指定设备名称
NoEquipmentName:
	// 无外放设备 直接操作当前设备
	if userParams.DeviceType == 1 && len(userParams.Sta) > 0 {
		res.SetData("name", "设备")
		res.Answer = fmt.Sprintf("正在为您%s设备", actMsg)
		res.IsHandle = true
		return
	}

	// 询问槽位
	res.IsEnd = false
	res.Answer = "请指定需要操作的设备名称"
	res.Slot = "equipment"
	return

	// 操作使用模式
UseMode:
	um, err := models.GetUseModeByName(userParams.UserId, eqName, "模式")
	if err != nil {
		return
	}
	if um == nil {
		res.Answer = "您还没有" + eqName
		return
	}

	// 修改模式状态
	if actMsg == "打开" {
		um.IsActivate = 1
	} else {
		if um.Trigger == models.UM_MANUAL {
			res.Answer = "手动触发不能手动关闭"
			return
		}
		um.IsActivate = 0
	}

	if err = models.UpdateUseModeStatus(um); err != nil {
		return
	}
	res.Answer = eqName + "已经" + actMsg
	return
}
